package com.zzuli.yxy.controller;

import com.zzuli.yxy.entity.Song;
import com.zzuli.yxy.enumeration.AppHttpCodeEnum;
import com.zzuli.yxy.result.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.zzuli.yxy.service.SongService;

import java.util.List;

/**
 * @auther pony
 * @create 2023-04-14 14:00
 */
@RestController
@RequestMapping("song")
@CrossOrigin(origins = "*")
public class SongController {
    @Autowired
    private SongService songService;

    /**
     * 获取歌曲管理分页信息
     * @param pageCurrent 当前页
     * @param pageSize 每页条数
     * @param name 关键字 非必传
     * @return
     */
    @GetMapping({"/page/{pageCurrent}/{pageSize}",
            "/page/{pageCurrent}/{pageSize}/{name}"})
    public R getPage(@PathVariable("pageCurrent") Integer pageCurrent,
                     @PathVariable("pageSize") Integer pageSize,
                     @PathVariable(name = "name", required = false) String name){
        return songService.getPage(pageCurrent, pageSize, name);
    }

    /**
     * 添加歌曲-添加歌曲名和歌曲状态
     * 歌曲图片和歌曲MP3文件，请参考下面的各自的上传方法
     * @param song
     * @return
     */
    @PostMapping("/add")
    public R addSong(@RequestBody Song song) {
        //System.out.println("song:"+song);
        // 数据非空判断，主要是 歌曲名和状态
        if (song.getSongName()==null||"".equals(song.getSongName())){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        if (song.getSongStatus()==null||"".equals(song.getSongStatus())) {
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return songService.addSong(song);
    }

    /**
     * 添加歌曲-上传歌曲图片
     * @param file 图片
     * @return
     */
    @PostMapping("/uploadAddImg")
    public R uploadAddImg(MultipartFile file) {

        // System.out.println("fileName:"+file.getOriginalFilename());
        // 1、文件校验
        // 是否是图片文件 image/jpeg，是不是以 image 开头的
        if (!file.getContentType().startsWith("image")){
            return R.error(AppHttpCodeEnum.IMAGE_ERROR_TYPE);
        }
        if (file.getSize() > 30*1024*1024){
            return R.error(AppHttpCodeEnum.FILE_EXCEED);
        }
        return songService.uploadAddImg(file);
    }

    /**
     * 添加歌曲-上传歌曲歌词
     * @param file 歌词 .txt 文件
     * @return
     */
    @PostMapping("/uploadAddLrc")
    public R uploadAddLrc(MultipartFile file) {
        //System.out.println("fileName:"+file.getOriginalFilename());
        // 1、判断歌词文件是否为 txt 文件
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 截取，获取文件后缀
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        // 根据文件后缀，进行判断
        if (!".txt".equals(prefix)){
            return R.error(AppHttpCodeEnum.MP3_ERROR_TYPE);
        }
        return songService.uploadAddLrc(file);
    }

    /**
     * 添加歌曲-上传歌曲 .mp3
     * @param file 歌词 .txt 文件
     * @return
     */
    @PostMapping("/uploadAddMp3")
    public R uploadAddMp3(MultipartFile file) {

        // System.out.println("fileName:"+file.getOriginalFilename());
        // 1、判断歌词文件是否为 txt 文件
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 截取，获取文件后缀
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        // 根据文件后缀，进行判断
        if (!".mp3".equals(prefix)){
            return R.error(AppHttpCodeEnum.MP3_ERROR_TYPE);
        }
        return songService.uploadAddMp3(file);
    }

    /**
     * 更改歌曲当前状态
     * @param status 状态码 0：正常 1：异常
     * @return
     */
    @GetMapping("/status/{id}/{status}")
    public void setStatus(@PathVariable("id") Integer id, @PathVariable("status") Integer status){
        songService.setStatus(id, status);
    }

    /**
     * 根据歌曲 id，删除歌曲
     * @param id 歌曲id
     * @return
     */
    @DeleteMapping("/delete/{id}")
    public R deleteSongById(@PathVariable("id") Integer id) {
        return songService.deleteSongById(id);
    }

    /**
     * 根据歌曲id，查询单个歌曲信息
     * @param id 歌曲id
     * @return
     */
    @GetMapping("/selectOne/{id}")
    public R selectOneById(@PathVariable("id") Integer id){
        return songService.selectOneById(id);
    }

    /**
     * 修改歌曲基本信息
     * 只需要修改数据库里的 歌曲基本信息
     * 对于 数据库里的信息可以使用 update
     * 对于 云存储桶里 歌曲图片和歌曲 MP3 文件，先删除再添加，调用的上传的 api，本接口不需要处理
     * @param song
     * @return
     */
    @PutMapping("/update")
    public R updateSong(@RequestBody Song song){
        //非空判断
        if ("".equals(song.getSongName())||song.getSongName()==null){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return songService.updateSong(song);
    }

    /**
     * 批量删除
     * @param ids 歌曲 id数组
     * @return
     */
    @DeleteMapping("deleteBatch")
    public R deleteSongBatch(@RequestBody List<Integer> ids){
        if(ids == null || ids.size() ==0 ){
            return R.error(AppHttpCodeEnum.PARAMETER_LACK);
        }
        return songService.deleteSongBatch(ids);
    }

    /**
     * 为 歌曲添加歌手信息和此歌手的专辑信息
     * @param songId 待添加的歌曲id
     * @param singerId  要添加的歌手id ，-1 表示用户没传
     * @param albumId  要添加的歌手id ，-1 表示用户没传，就不用添加了
     * @return
     */
    @PostMapping("addSingerAlbumForSong/{songId}/{singerId}/{albumId}")
    public R addSingerAlbumForSong(@PathVariable("songId") Integer songId, @PathVariable("singerId") Integer singerId,
                              @PathVariable("albumId") Integer albumId){
        return songService.addSingerAlbumForSong(songId, singerId, albumId);
    }
}
